//1. 导入 axios
import axios from '../../utils/http'; // axios.get('http://')

// 任务的数组
// 声明 reducer 函数
let todoReducer = (state = [], action) => {
  //根据 action.type 操作类型, 对 state 数据进行更新
  switch (action.type) {
    //设置 state 的初始值
    // dispatch({type: 'TODO_INIT', payload: [{id: 1, title: 'xxx', done: false}, {id: 2, title: 'yyy', done: false}]})
    case "TODO_INIT":
      return [...action.payload];

    //新增任务
    // dispatch({type: 'TODO_ADD', payload: {id: 2, title: '做饭', done: false}})
    case "TODO_ADD":
      return [...state, action.payload];

    //修改任务的完成状态
    // dispatch({type: 'TODO_CHECK', payload: {id: 2, done: true}})
    case "TODO_CHECK":
      return state.map((item) => {
        //比对 id
        if (item.id === action.payload.id) {
          //将指定 id 的任务状态设置为『要修改成的状态』
          item.done = action.payload.done;
        }
        return item;
      });

    //删除任务
    // dispatch({type: 'TODO_REMOVE', payload: 1});
    case "TODO_REMOVE":
      return state.filter((item) => item.id !== action.payload);

    //批量修改任务的状态
    // dispatch({type: 'TODO_CHECK_ALL', payload: true});
    case "TODO_CHECK_ALL":
      //批量修改任务的完成状态, 并返回新数组
      return state.map((item) => {
        item.done = action.payload;
        return item;
      });

    //批量移除已经完成的任务
    //dispatch({type: 'TODO_REMOVE_DONE'})
    case "TODO_REMOVE_DONE":
      return state.filter((item) => !item.done);

    //默认情况
    default:
      return state;
  }
};

//暴露
export default todoReducer;

//『action creator』 的声明.  创建 action 对象的函数
//初始化
export function initTodoAction(payload){
  return {
    type: 'TODO_INIT',
    payload: payload
  }
}

//新增任务
export function addTodoAction(todo){
  return {
    type: 'TODO_ADD',
    payload: todo
  }
}

//修改任务的完成状态
export function checkTodoAction(payload){
  return {
    type: 'TODO_CHECK',
    payload
  }
}

//删除任务
export function removeTodoAction(id){
  return {
    type: 'TODO_REMOVE',
    payload: id
  }
}

//批量修改任务状态
export function checkAllTodo(done){
  return {
    type: 'TODO_CHECK_ALL',
    payload: done
  }
}

//批量移除已经完成的任务
export function removeDoneTodo(){
  return {
    type: 'TODO_REMOVE_DONE'
  }
}

//异步更新 redux 中的状态  dispatch(函数)
export function asyncReqGetTodo(){
  return async dispatch => {
    //发送请求 获取任务数据
    let data = await axios.get('/todo');//
    //同步更新 redux 中保存的 todo 状态
    dispatch(initTodoAction(data));
  }
}

//异步更新状态  新增任务  
export function asyncReqAddTodo(title){
  return async dispatch => {
    //拼接对象
    let todo = {
      title: title,
      done: false
    }
    //发送请求新增任务  result 是响应体 『新增请求响应体是 todo 对象』
    let result = await axios.post('/todo', todo);
    //同步更新状态 redux 中新增一个任务
    dispatch(addTodoAction(result));
  }
}

//异步更新状态  更新任务完成状态    {id: 1, done: false}
export function asyncReqCheckTodo(todo){
  return async dispatch => {
    //获取 id 与 done 的值
    let {id, done} = todo;
    //发送请求更新服务器状态
    await axios.patch(`/todo/${id}`, {done: done});
    //更新 redux 中的状态值
    dispatch(checkTodoAction(todo));
  }
}

//异步更新状态 删除某个任务
export function asyncReqRemoveTodo(id){
  return async dispatch => {
    //发送请求  删除任务
    await axios.delete(`/todo/${id}`);
    //如果删除成功  更新 redux 中的状态
    dispatch(removeTodoAction(id));
  }
}